package Presentacion;

import Clases.Empleado;
import Clases.Pago;
import Clases.Vacacion;
import Clases.VacacionPagada;
import Control.ControlEmpleado;
import Control.ControlPago;
import Control.ControlVacaciones;
import Control.ControlVacacionesPagadas;
import de.javasoft.plaf.synthetica.SyntheticaLookAndFeel;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.RowFilter;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;

public class Empleados extends javax.swing.JFrame {

    /**
     * Variables de la clase.
     */
    ControlEmpleado controlE = ControlEmpleado.obtenerInstancia();
    ControlPago controlP = ControlPago.obtenerInstancia();
    private TableRowSorter sorter = new TableRowSorter();
    ControlVacaciones controlV = ControlVacaciones.obtenerInstancia();
    ControlVacacionesPagadas controlVP = ControlVacacionesPagadas.obtenerInstancia();
    String caso = "";

    /**
     * Constructor de la clase que inicializa todos sus elementos.
     */
    public Empleados() {
        initComponents();
    }

    /**
     * Método que hace visible esta interfaz con sus respectivas propiedades.
     * Asigna también un Look And Feel a la interfaz. Agrega una funcion de
     * filtro para la barra de busqueda. Oculta botones dependiendo el caso.
     *
     * @param caso es la clase que solicita su uso y dependiendo de eso se
     * muestra o ocultan botones y su funcionalidad es diferente.
     */
    public void init(String caso) {
        setTitle("Lista de Empleados");
        setLocationRelativeTo(null);
        UIManager.removeAuxiliaryLookAndFeel(UIManager.getLookAndFeel());
        SwingUtilities.updateComponentTreeUI(this);
        try {
            UIManager.removeAuxiliaryLookAndFeel(UIManager.getLookAndFeel());
            SyntheticaLookAndFeel.setWindowsDecorated(false);
            UIManager.setLookAndFeel("de.javasoft.plaf.synthetica.SyntheticaAluOxideLookAndFeel");
            SwingUtilities.updateComponentTreeUI(this);

        } catch (Exception ex) {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        sorter.setModel(jTable3.getModel());
        jTable3.setRowSorter(sorter);
        jTextField1.getDocument().addDocumentListener(
                new DocumentListener() {
                    public void changedUpdate(DocumentEvent e) {
                        newFilter();
                    }

                    public void insertUpdate(DocumentEvent e) {
                        newFilter();
                    }

                    public void removeUpdate(DocumentEvent e) {
                        newFilter();
                    }
                });
        if (caso.equals("historicos")) {
            this.llenarTablaEmpleadosHistoricos();
        } else {
            this.llenarTablaEmpleados();
        }
        jTable3.getColumnModel().getColumn(0).setWidth(jTable3.getColumnModel().getColumn(0).getMinWidth() + 10);
        jTable3.getColumnModel().getColumn(0).setMaxWidth(jTable3.getColumnModel().getColumn(0).getMinWidth() + 10);
        if (caso.equals("empleado")) {
            jButton6.setText("Eliminar");
            jButton5.setVisible(true);
        } else {
            if (caso.equals("historicos")) {
                jButton6.setText("Ver Pagos");
                jButton5.setVisible(false);
            } else {
                jButton6.setText("Aceptar");
                jButton5.setVisible(false);
            }
        }
        this.caso = caso;
        this.setVisible(true);
    }

    /**
     * Método que obtiene el nombre de los empleados seleccionados de la tabla.
     */
    public ArrayList<String> getNombresSeleccionados() {
        ArrayList<String> empleados = new ArrayList<String>();
        for (int i = 0; i < jTable3.getRowCount(); i++) {
            if ((Boolean) jTable3.getValueAt(i, 0).equals(Boolean.TRUE)) {
                empleados.add(jTable3.getValueAt(i, 1).toString() + " " + jTable3.getValueAt(i, 2).toString());
            }
        }
        return empleados;
    }

    /**
     * Método que llena una tabla de empleados actuales en el sistema.
     */
    public void llenarTablaEmpleados() {
        ArrayList<Empleado> empleados = controlE.obtenerListaEmpleados();
        DefaultTableModel m = (DefaultTableModel) jTable3.getModel();
        try {
            while (m.getRowCount() > 0) {
                m.removeRow(0);
            }
            for (int i = 0; i < empleados.size(); i++) {
                m.insertRow(m.getRowCount(), new Object[]{false, empleados.get(i).getNombre(),
                    empleados.get(i).getApellido1(), empleados.get(i).getCedula(), empleados.get(i).getCodigo()});
            }
        } catch (Exception e) {
            System.out.println(e.getCause());
        }
    }

    /**
     * Método que llena una tabla de empleados históricos en el sistema.
     */
    public void llenarTablaEmpleadosHistoricos() {
        ArrayList<Empleado> empleados = controlE.obtenerListaEmpleadosHistoricos();
        DefaultTableModel m = (DefaultTableModel) jTable3.getModel();
        try {
            while (m.getRowCount() > 0) {
                m.removeRow(0);
            }
            for (int i = 0; i < empleados.size(); i++) {
                m.insertRow(m.getRowCount(), new Object[]{false, empleados.get(i).getNombre(),
                    empleados.get(i).getApellido1(), empleados.get(i).getCedula(), empleados.get(i).getCodigo()});
            }
        } catch (Exception e) {
            System.out.println(e.getCause());
        }
    }

    /**
     * Método que crea el filtro de la barra de busqueda. Filra por
     * cédula,código, nombre y apellido de un empleado.
     */
    private void newFilter() {
        RowFilter<DefaultTableModel, Object> cedulaFilter = null;
        RowFilter<DefaultTableModel, Object> codigoFilter = null;
        RowFilter<DefaultTableModel, Object> nombreFilter = null;
        RowFilter<DefaultTableModel, Object> apellidoFilter = null;
        List<RowFilter<DefaultTableModel, Object>> filters = new ArrayList<RowFilter<DefaultTableModel, Object>>();
        RowFilter<DefaultTableModel, Object> compoundRowFilter = null;
        try {
            cedulaFilter = RowFilter.regexFilter("(?i)^" + jTextField1.getText(), 3);
            codigoFilter = RowFilter.regexFilter("(?i)^" + jTextField1.getText(), 4);
            nombreFilter = RowFilter.regexFilter("(?i)^" + jTextField1.getText(), 1);
            apellidoFilter = RowFilter.regexFilter("(?i)^" + jTextField1.getText(), 2);
            filters.add(cedulaFilter);
            filters.add(codigoFilter);
            filters.add(nombreFilter);
            filters.add(apellidoFilter);
            compoundRowFilter = RowFilter.orFilter(filters);
        } catch (java.util.regex.PatternSyntaxException e) {
            return;
        }
        sorter.setRowFilter(compoundRowFilter);
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPopupMenu1 = new javax.swing.JPopupMenu();
        jPanel2 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        jScrollPane3 = new javax.swing.JScrollPane();
        jTable3 = new javax.swing.JTable();
        jButton5 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jButton6 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setMinimumSize(new java.awt.Dimension(590, 370));

        jPanel2.setBorder(javax.swing.BorderFactory.createEtchedBorder());

        jLabel1.setFont(new java.awt.Font("Tahoma", 1, 18)); // NOI18N
        jLabel1.setText("Empleados");

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel2.setText("Buscar:");

        jTextField1.setToolTipText("Ingrese el nombre, apellido,cédula o código del empleado");

        jTable3.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "", "Nombre", "Apellido", "Cédula", "Código"
            }
        ) {
            Class[] types = new Class [] {
                java.lang.Boolean.class, java.lang.Object.class, java.lang.String.class, java.lang.Object.class, java.lang.Object.class
            };
            boolean[] canEdit = new boolean [] {
                true, false, true, false, false
            };

            public Class getColumnClass(int columnIndex) {
                return types [columnIndex];
            }

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jScrollPane3.setViewportView(jTable3);
        if (jTable3.getColumnModel().getColumnCount() > 0) {
            jTable3.getColumnModel().getColumn(3).setResizable(false);
        }

        jButton5.setText("Gestión de empleados");
        jButton5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton5ActionPerformed(evt);
            }
        });

        jButton3.setText("Salir");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });

        jButton6.setText("Eliminar");
        jButton6.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton6ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 549, Short.MAX_VALUE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                        .addGap(0, 0, Short.MAX_VALUE)
                        .addComponent(jButton5)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jButton6)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jButton3))
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addGroup(jPanel2Layout.createSequentialGroup()
                                .addGap(220, 220, 220)
                                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 111, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(jPanel2Layout.createSequentialGroup()
                                .addContainerGap()
                                .addComponent(jLabel2)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 249, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(15, 15, 15)))
                        .addGap(0, 0, Short.MAX_VALUE)))
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(14, 14, 14)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 202, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jButton6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(jButton5))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(16, 16, 16)
                .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton5ActionPerformed
        ManejoEmpleado empleado = ManejoEmpleado.obtenerInstancia();
        ArrayList<Long> seleccionado = getEmpleadoSeleccionados();
        empleado.limpiar();
        if (seleccionado.isEmpty()) {
            empleado.init(this, "0");
        } else {
            if (seleccionado.size() == 1) {
                empleado.init(this, String.valueOf(seleccionado.get(0)));
            } else {
                JOptionPane.showMessageDialog(null, "Solo puede elegir un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            }
        }

    }//GEN-LAST:event_jButton5ActionPerformed

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton3ActionPerformed
        dispose();
    }//GEN-LAST:event_jButton3ActionPerformed

    /**
     * Método que obtiene los empleados seleccionados de la tabla.
     */
    public ArrayList<Long> getEmpleadoSeleccionados() {
        ArrayList<Long> empleados = new ArrayList<Long>();
        for (int i = 0; i < jTable3.getRowCount(); i++) {
            if ((Boolean) jTable3.getValueAt(i, 0).equals(Boolean.TRUE)) {
                empleados.add((Long) jTable3.getValueAt(i, 3));
            }
        }
        return empleados;
    }

    /**
     * Método que dependiendo el caso llama a un método especifico.
     */
    private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton6ActionPerformed

        ArrayList<Long> seleccionados = this.getEmpleadoSeleccionados();

        if (caso.equals("empleado")) {
            opcionEmpleado(seleccionados);
        } else {
            if (caso.equals("bono1") || caso.equals("bono2")) {
                opcionBono(seleccionados);
            } else {
                if (caso.equals("consultarPrestamo")) {
                    opcionConsultarPrestamo(seleccionados);
                } else {
                    if (caso.equals("liquidacion")) {
                        opcionLiquidacion(seleccionados);
                    } else {
                        if (caso.equals("consultarDeducciones")) {
                            opcionDeducciones(seleccionados);
                        } else {
                            if (caso.equals("consultarVacacion")) {
                                opcionManejoVacaciones(seleccionados);
                            } else {
                                if (caso.equals("adelantoAguinaldo")) {
                                    opcionAdelantoAguinaldo(seleccionados);
                                } else {
                                    if (caso.equals("historicos")) {//
                                        opcionHistoricos(seleccionados);
                                    } else {//reportesPlanillaEmpleado
                                        if (caso.equals("reportesPlanillaEmpleado")) {
                                            opcionPlanillaEmpleado(seleccionados);
                                        } else {
                                            opcionPrestamo(seleccionados);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }//GEN-LAST:event_jButton6ActionPerformed
    /**
     * Método que obtiene la cantidad de vacaciones que tiene un empleado
     *
     * @param inicio sirve para determinar a partir de cuendo calcular la
     * cantidad total de vacaciones.
     * @param numEmpleado sirve para filtrar por empleado.
     */
    int calcularVacaciones(Date inicio, Long numEmpleado) {
        Date actual = new Date();
        int totalVacaciones = 0;
        int anioInicio = inicio.getYear();
        int anioActual = actual.getYear();
        int diaInicio = inicio.getDate();
        int diaActual = actual.getDate();
        int mesActual = actual.getMonth();
        int mesInicio = inicio.getMonth();
        if (anioInicio < anioActual) {
            mesInicio = 0;
            if (diaInicio <= diaActual) {
                mesInicio = 0;
                totalVacaciones = mesActual - mesInicio;
            } else if (diaInicio > diaActual) {

                totalVacaciones = mesActual - mesInicio - 1;

            }
        } else if (anioInicio == anioActual) {
            if (mesInicio == mesActual) {
                totalVacaciones = 0;
            } else if (mesInicio <= mesActual) {
                if (diaInicio > diaActual) {
                    totalVacaciones = mesActual - mesInicio - 1;
                } else if (diaInicio <= diaActual) {
                    totalVacaciones = mesActual - mesInicio;
                }

            }
        } else {
            JOptionPane.showMessageDialog(null, "La fecha inicio es mayor a la fecha actual", "Mensaje", JOptionPane.INFORMATION_MESSAGE);
        }
        List<Vacacion> vacaciones = controlV.getVacacionesPorNumEmpleado(numEmpleado);

        List<VacacionPagada> vacacionesP = controlVP.getVacacionesPorNumEmpleado(numEmpleado);

        if (!vacaciones.isEmpty()) {
            totalVacaciones = totalVacaciones - vacaciones.size();
        }
        if (!vacacionesP.isEmpty()) {
            totalVacaciones = totalVacaciones - vacacionesP.size();
        }

        return totalVacaciones;
    }

    /**
     * Método que sirve para setear los campos en la clase Manejo Vacaciones
     * dependiendo de lo calculado.
     *
     * @param seleccionados sirva para validar que al menos se elija un empleado
     * para realizar el calculo de vacaciones.
     */
    private void opcionManejoVacaciones(ArrayList<Long> seleccionados) {
        if (seleccionados.size() == 1) {
            Long cedulaEmpleado = seleccionados.get(0);
            ManejoVacaciones v = ManejoVacaciones.obtenerInstancia();
            v.setCedField(cedulaEmpleado.toString());
            Empleado empleado = controlE.getEmpleadoCedula(cedulaEmpleado);
            v.setLabelNombre(empleado.getNombre() + " " + empleado.getApellido1());
            v.setCodigo(empleado.getCodigo());
            Date inicio = empleado.getFechaIngreso();
            Date actual = new Date();
            int totalVacaciones = calcularVacaciones(inicio, empleado.getNumEmpleado());
            v.llenarTablaVacaciones(totalVacaciones);
            dispose();
        } else {
            if (seleccionados.size() > 1) {
                JOptionPane.showMessageDialog(null, "Solo puede elegir un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null, "Por favor, seleccione un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    /**
     * Método que sirve para setear los campos en la clase
     * OpcionesReportesPlanillaEmpleado con la cedula del empleado seleccionado
     *
     * @param seleccionados sirva para validar que al menos se elija un empleado
     * para realizar el calculo de vacaciones y enviar su cédula a la clase
     * OpcionesReportesPlanillaEmpleado.
     */
    private void opcionPlanillaEmpleado(ArrayList<Long> seleccionados) {
        if (seleccionados.size() == 1) {
            Long cedulaEmpleado = seleccionados.get(0);
            OpcionesReportesPlanillaEmpleado ventana = OpcionesReportesPlanillaEmpleado.obtenerInstancia();
            ventana.setjTextFieldsCrear(cedulaEmpleado.toString());
            dispose();
        } else {
            if (seleccionados.size() > 1) {
                JOptionPane.showMessageDialog(null, "Solo puede elegir un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null, "Por favor, seleccione un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    /**
     * Método que sirve para eliminar los empleados seleccionados.
     *
     * @param seleccionados sirva para validar que al menos se elija un empleado
     * y eliminarlos.
     *
     */
    private void opcionEmpleado(ArrayList<Long> seleccionados) {
        boolean elimino = false;
        if (seleccionados.isEmpty()) {
            JOptionPane.showMessageDialog(null, "Seleccione al menos un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
        } else {
            int confirmado = JOptionPane.showConfirmDialog(null, "¿Está seguro que quiere eliminar el/los empleado(s)?");
            if (JOptionPane.OK_OPTION == confirmado) {
                for (int i = 0; i < seleccionados.size(); i++) {
                    Empleado empleado = controlE.getEmpleadoCedula(seleccionados.get(i));
                    ArrayList<Pago> pagos = controlP.getPagoEmpleado(empleado.getNumEmpleado());
                    if (pagos.size() == 1 || pagos.size() == 0) {
                        elimino = controlE.eliminarEmpleado(empleado);
                    } else {
                        elimino = false;
                    }
                }
            }
            if (elimino) {
                JOptionPane.showMessageDialog(null, "El empleado se elimino con éxito", "Mensaje", JOptionPane.INFORMATION_MESSAGE);
                //Empleados empleados = new Empleados();
                //empleados.llenarTablaEmpleados();
                this.llenarTablaEmpleados();
            } else {
                JOptionPane.showMessageDialog(null, "No se pudo eliminar el empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    /**
     * Método que sirve para setear los campos respectivos en la clase
     * ConsultarBonos
     *
     * @param seleccionados sirva para validar que al menos se elija un empleado
     * y obtener sus datos.
     */
    private void opcionBono(ArrayList<Long> seleccionados) {
        if (seleccionados.size() == 1) {
            Long cedulaEmpleado = seleccionados.get(0);
            ConsultarBonos b = ConsultarBonos.obtenerInstancia();
            ArrayList<String> nombre = getNombresSeleccionados();

            b.setEmpleado(cedulaEmpleado.toString(), nombre.get(0), caso);
            dispose();
        } else {
            if (seleccionados.size() > 1) {
                JOptionPane.showMessageDialog(null, "Solo puede elegir un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null, "Por favor, seleccione un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    /**
     * Método que sirve para setear los campos respectivos en la clase
     * VerPagosHistoricos
     *
     * @param seleccionados sirva para validar que al menos se elija un empleado
     * y obtener sus datos.
     */
    private void opcionHistoricos(ArrayList<Long> seleccionados) {
        if (seleccionados.size() == 1) {
            Long cedulaEmpleado = seleccionados.get(0);
            VerPagosHistoricos historicos = VerPagosHistoricos.obtenerInstancia();
            historicos.init(cedulaEmpleado);
            dispose();
        } else {
            if (seleccionados.size() > 1) {
                JOptionPane.showMessageDialog(null, "Solo puede elegir un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null, "Por favor, seleccione un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    /**
     * Método que sirve para setear los campos respectivos en la clase
     * DeduccionesEmpleado
     *
     * @param seleccionados sirva para validar que al menos se elija un empleado
     * y obtener sus datos para llenar la tabla respectivamente.
     */
    private void opcionDeducciones(ArrayList<Long> seleccionados) {
        if (seleccionados.size() == 1) {
            Long cedulaEmpleado = seleccionados.get(0);
            DeduccionesEmpleado d = DeduccionesEmpleado.obtenerInstancia();
            d.setjTextFields(cedulaEmpleado.toString());
            Empleado empleado = controlE.getEmpleadoCedula(cedulaEmpleado);
            d.llenarTablaAsignaciones(empleado.getNumEmpleado());
            dispose();
        } else {
            if (seleccionados.size() > 1) {
                JOptionPane.showMessageDialog(null, "Solo puede elegir un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null, "Por favor, seleccione un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    /**
     * Método que sirve para setear los campos respectivos en la clase
     * ManejoPrestamos
     *
     * @param seleccionados sirva para validar que al menos se elija un empleado
     * y obtener sus datos .
     */
    private void opcionPrestamo(ArrayList<Long> seleccionados) {
        if (seleccionados.size() == 1) {
            Long cedulaEmpleado = seleccionados.get(0);
            ManejoPrestamos p = ManejoPrestamos.obtenerInstancia();
            p.setjTextFieldsCrear(cedulaEmpleado.toString());
            dispose();
        } else {
            if (seleccionados.size() > 1) {
                JOptionPane.showMessageDialog(null, "Solo puede elegir un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null, "Por favor, seleccione un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    /**
     * Método que sirve para setear los campos respectivos en la clase
     * LiquidacionCesantia
     *
     * @param seleccionados sirva para validar que al menos se elija un empleado
     * y obtener sus datos .
     */
    private void opcionLiquidacion(ArrayList<Long> seleccionados) {
        if (seleccionados.size() == 1) {
            Long cedulaEmpleado = seleccionados.get(0);
            LiquidacionCesantia liquidacion = LiquidacionCesantia.obtenerInstancia();
            Empleado empleado = controlE.getEmpleadoCedula(cedulaEmpleado);
            liquidacion.setLabelsEmpleado(cedulaEmpleado.toString(), empleado.getNombre() + " " + empleado.getApellido1(), empleado.getCodigo());
            DateFormat fecha = new SimpleDateFormat("yyyy/MM/dd");
            String fechaIngreso = fecha.format(empleado.getFechaIngreso());
            liquidacion.setFechaIngreso(fechaIngreso);
            dispose();
        } else {
            if (seleccionados.size() > 1) {
                JOptionPane.showMessageDialog(null, "Solo puede elegir un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null, "Por favor, seleccione un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    /**
     * Método que sirve para setear los campos respectivos en la clase
     * ManejoPrestamos
     *
     * @param seleccionados sirva para validar que al menos se elija un empleado
     * y obtener sus datos .
     */
    private void opcionConsultarPrestamo(ArrayList<Long> seleccionados) {
        if (seleccionados.size() == 1) {
            Long cedulaEmpleado = seleccionados.get(0);
            ManejoPrestamos p = ManejoPrestamos.obtenerInstancia();
            p.setjTextFieldsConsultar(cedulaEmpleado.toString());
            p.llenarTablaAsignacionesPrestamo();
            dispose();
        } else {
            if (seleccionados.size() > 1) {
                JOptionPane.showMessageDialog(null, "Solo puede elegir un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null, "Por favor, seleccione un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    /**
     * Método que sirve para setear los campos respectivos en la clase
     * ManejoAdelantoAguinaldo
     *
     * @param seleccionados sirva para validar que al menos se elija un empleado
     * y obtener sus datos .
     */
    private void opcionAdelantoAguinaldo(ArrayList<Long> seleccionados) {
        if (seleccionados.size() == 1) {
            Long cedulaEmpleado = seleccionados.get(0);
            String nombre = getNombresSeleccionados().get(0);
            ManejoAdelantoAguinaldo adelantoAguinaldo = ManejoAdelantoAguinaldo.obtenerInstancia();
            Double aguilandoDisponible = adelantoAguinaldo.calcularAguinaldoDisponible(cedulaEmpleado);
            adelantoAguinaldo.setCampos(cedulaEmpleado, nombre, aguilandoDisponible);
            adelantoAguinaldo.llenarTablaAdelantos();
            dispose();
        } else {
            if (seleccionados.size() > 1) {
                JOptionPane.showMessageDialog(null, "Solo puede elegir un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(null, "Por favor, seleccione un empleado", "Mensaje", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;

                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Empleados.class
                    .getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Empleados.class
                    .getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Empleados.class
                    .getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Empleados.class
                    .getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Empleados().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton5;
    private javax.swing.JButton jButton6;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPopupMenu jPopupMenu1;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JTable jTable3;
    private javax.swing.JTextField jTextField1;
    // End of variables declaration//GEN-END:variables
}
